package com.niiwoo.civet.trade.service.project;

import com.niiwoo.civet.trade.dto.common.ProjectAndBorrowerPlanDTO;
import com.niiwoo.civet.trade.dto.common.ProjectBorrowerSummaryDTO;
import com.niiwoo.civet.trade.dto.common.ProjectDTO;
import com.niiwoo.civet.trade.dto.common.ProjectDynamicDTO;
import com.niiwoo.civet.trade.dto.request.CardniuProjectDTO;
import com.niiwoo.civet.trade.dto.request.OrgProjectDTO;
import com.niiwoo.civet.trade.dto.request.ProjectBackRequestDTO;
import com.niiwoo.civet.trade.dto.request.ProjectConfirmRequestDTO;
import com.niiwoo.civet.trade.dto.request.ProjectFlowRequestDTO;
import com.niiwoo.civet.trade.dto.request.loan.CardniuLoanApplyOrderDTO;
import com.niiwoo.civet.trade.dto.response.CurrentPeriodToReturnDTO;
import com.niiwoo.civet.trade.dto.response.CustomSysBorrowerInfoDTO;
import com.niiwoo.civet.trade.dto.response.ProjectDetailDTO;
import com.niiwoo.civet.trade.dto.response.QueryLoanDeviceInfoResponseDTO;
import com.niiwoo.civet.trade.dto.response.SpeedLoanRecordStatisticsDTO;
import com.niiwoo.civet.trade.dto.response.newRefund.RefundFreezeParamResponseDTO;
import com.niiwoo.civet.trade.enums.ProjectFromSourceEnum;
import com.niiwoo.civet.trade.enums.ProjectStatusEnum;

import javax.el.MethodNotFoundException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface ProjectDubboService {

    ProjectDTO selectProjectById(Long projectId);

    ProjectAndBorrowerPlanDTO selectProjectAndPlanByProjectIdAndPeriod(Long projectId, Integer period);

    Byte selectProjectLendRecordByProjectId(Long projectId);

    SpeedLoanRecordStatisticsDTO querySpeedLoanRecordStatistics(String userId);

    void sendMqToAssetSide(String userId);

    QueryLoanDeviceInfoResponseDTO queryLoanDeviceInfo(Long projectId);
    
    /**
     * 根据用户ID查询最后一次借款的设备信息
     * @param userId
     * @return
     */
    default QueryLoanDeviceInfoResponseDTO queryUserLastLoanDeviceInfo(String userId) {
    	return null;
    }

    /**
     * 流标
     */
    void flow(ProjectFlowRequestDTO requestDTO);
	
	/**
     * 融360超时未确认流标
     * 
     * @author kevin.jia
     */
    void r360TimeoutUnconfirmedFlow();

    void addProjectDynamicRecord(ProjectDynamicDTO projectDynamicDTO);


    void r360Back(ProjectBackRequestDTO reqDTO);
    /**
     * 退回
     */
    void back(ProjectBackRequestDTO reqDTO);

    /**
     * 通过待确认
     */
    void confirm(ProjectConfirmRequestDTO reqDTO);

    /**
     * 查询在审核状态中的某一时间区间的标列表
     * @return
     */
    List<ProjectDTO> queryAuthNotifyAuditProjectList(Date endDate);

    /**
     * 查询审核中和投资中标的数量
     * @param userId
     * @param fromSourceEnum
     * @return
     */
    Integer countProjectNumInApproveAndInvest(String userId,ProjectFromSourceEnum fromSourceEnum);

    /**
     * 查询审核中的借款笔数
     * @param userId
     * @return
     */
    Integer queryInAuditProjectCount(String userId);

    /**
     * 查询极速借提交借款笔数 （这个接口暂时保留，兼容 你我金融与暖心借）
     * @param userId
     * @return
     */
    default Integer queryProjectCountByUserId(String userId){
        throw new UnsupportedOperationException("未实现的方法");
    }
    /**
     * 查询极速借提交借款笔数
     * @param userId
     * @return
     */
    default Integer queryProjectCountByUserId(String userId,String orgId){
        throw new UnsupportedOperationException("未实现的方法");
    }

    /**
     * 查询最近一次借款记录
     * @param userId
     * @return
     */
    ProjectDTO queryLastProjectByUserId(String userId);

    /**
     * 审核中的标的
     * @param subStatus
     * @return
     */
    Integer findProjectByStatus(String userId,List<Byte> subStatus);

    /**
     * 卡牛标的初始化
     * @param cardniuProjectDTO
     */
    Long cardNiuProject(CardniuProjectDTO cardniuProjectDTO);

    /**
     * 发起风险规则
     * @param cardniuLoanApplyOrderDTO
     */
    void startRiskInfo(CardniuLoanApplyOrderDTO cardniuLoanApplyOrderDTO);

    /**
     * 查询标的总利息
     * @param projectId
     * @return
     */
    public BigDecimal queryTotalInterestByProjectId(Long projectId);

    /**
     * 查询借款中的标的数
     * @return
     */
    Integer queryLoaningProjectCount(String userId);

    /**
     * 查询逾期还款计划摘要列表
     * @param projectId
     * @return
     */
    ProjectBorrowerSummaryDTO queryDueProjectBorrowerSummaryByProjectId(Long projectId);

    /**
     * 查询成功借款次数
     * @param userId
     * @return
     */
    Integer queryLoanSuccessCount(String userId);

    /**
     * 查询标的待还金额项
     * @param projectId
     * @return
     */
    CurrentPeriodToReturnDTO queryCurrentPeriodToReturnByProjectId(Long projectId);

    /**
     * 查询用户指定状态的标的数量
     * @param userId
     * @param subStatus
     * @return
     */
    default Integer selectProjectCountBySubStatus(String userId,List<Integer> subStatus){ return null;}

    /**
     * 机构标的初始化
     *
     * @param orgProjectDTO
     */
    default void addOrgProject(OrgProjectDTO orgProjectDTO) {
        throw new UnsupportedOperationException("unimplemented");
    }

    /**
     * 机构标的推送存管
     * @param orderId
     */
    default void pushOrgProject(String orgId, Long orderId) {
        throw new UnsupportedOperationException("unimplemented");
    }

    default List<String> selectNotPassCause(String borrowerUserId, Long projectId){return null;}
    
    /**
     * 通过订单ID查询订单的冻结参数 
     * @param orderId
     * @return
     */
    default RefundFreezeParamResponseDTO queryRefundFreezeParam(Long orderId) {
    	throw new MethodNotFoundException("方法未实现");
    };


    /**
     * 查询符合项目状态的标的个数
     * @param userId
     * @param statusEnumList
     * @return
     */
    default Integer queryProjectByStatus(String userId, List<ProjectStatusEnum> statusEnumList){ return  null;}
    /**
     * 土巴兔修改project status 为 104
     */
    default void updateProjectStatus(Long projectId){throw new UnsupportedOperationException("unimplemented");}

    /**
     * 统计今日审核通过的标的数量
     *
     * @return
     */
    default Integer countTodayAuditPassProject(){return 0;}

    /**
     * 是否需要补签《还款服务委托书》
     * @param userId
     * @return 要签署的标的ID，返回null表示不需要补签
     */
    default Long isNeedSignRepayAgreementContractForOldUser(String userId) {
        return null;
    }

    /**
     * 查询未结清的标的数量(不包含机构极速借)
     * @param userId
     * @return
     */
    default Integer queryOutstandingProjectWithoutOrg(String userId){return null;}

    /**
     * 标的待发布转发布扫描
     */
    default void projectWaitPublishToPublishScan(){}

    /**
     * 标的重新分端
     * @param projectId
     * @param channelCode
     */
    default void resetProjectChannelCode(Long projectId, String channelCode) {

    }

    /**
     * 更新机构标的状态
     * @param projectId
     * @param status
     * @param subStatus
     */
    default void updateOrgProjectStatus(Long projectId, Byte status, Integer subStatus) {
    }

    default ProjectDetailDTO getProjectById(Long projectId){
        throw new MethodNotFoundException("方法未实现");
    }

    /**
     * 标的使用红包
     * @param projectId
     * @param prizeId
     */
    default void setProjectPrizeId(Long projectId, Long prizeId) {
    }

    /**
     * 查询借款人最大逾期天数
     * @param userId
     */
    default Integer queryMaxDueDays(String userId) {
        throw new UnsupportedOperationException("unimplemented");
    }

    /**
     * 查询借款人最大逾期天数
     * @param userId
     */
    default List<String> queryFromSourceListByUserId(String userId) {
        throw new UnsupportedOperationException("unimplemented");
    }

    /**
     * 查询当前期数的还款信息
     * @param projectId
     * @return
     */
	default CustomSysBorrowerInfoDTO queryCurrentPeriodRefundInfoByProjectId(Long projectId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
     * 查询还款信息列表
     * @param projectId
     * @return
     */
	default List<CustomSysBorrowerInfoDTO> queryRefundListInfoByProjectId(Long projectId) {
		throw new UnsupportedOperationException("unimplemented");
	}
}
